1. The Field of the Invention
The present invention relates to testing distributed applications. More specifically, the present invention relates to systems, methods, and computer-program products for including test information along with distributed application data in messages that are utilized by distributed applications during normal operation.
2. Background and Relevant Art
Computer systems and related technology affect many aspects of society. Indeed, the computer system's ability to process information has transformed the way we live and work. Computer systems now commonly perform a host of tasks (e.g. information management, scheduling, and word processing) that prior to the advent of the computer system were typically performed manually. More recently, computer systems have been coupled to one another to form computer networks over which computer systems may transfer data electronically.
Initially, a significant portion of data transfer on computer networks was performed using specific applications (e.g. electronic mail applications) to transfer data files from one computer system to another. For example, a first user at a first networked computer system could electronically mail a data file document to a second user at a second networked computer system. However, program execution (e.g. running the electronic mail application) and data access (e.g. attaching the data file to an electronic mail message) were essentially completely performed at a single computer system (e.g. at the first computer system). That is, a computer system would execute programs and access data from storage locations contained in the computer system. Thus, being coupled to a network would not inherently give one networked computer system the ability to access data files from another networked computer system. Only after a user actively sends a data file to a computer system could the computer system access the data file.
However more recently, as the availability of higher-speed networks has increased, many computer networks have shifted towards a distributed architecture. Such networks are frequently referred to as distributed systems. Distributed systems function to “distribute” program execution and data access across the modules of a number of different computer systems coupled to a network.
In a distributed system, modules connected to a common network interoperate and communicate between one another in a manner that may be transparent to a user. For example, a user of a client computer system may select an application program icon from a user-interface thereby causing an application program stored at a server computer system to execute. The user-interface may indicate to the user that the application program has executed, but the user may be unaware, and in fact may not care, that the application program was executed at the server computer system. The client computer system and the server computer system may communicate in the background to transfer the user's commands, program responses, and data between the client computer system and the server computer system.
Often, a distributed system includes a substantial number of client computer systems and server computer systems. In many cases, computer systems of a distributed system may function both as client computer systems and server computer systems, providing data and resources to some computer systems and receiving data and resources form other computer systems. Each computer system of a distributed system may include a different configuration of hardware and software modules. For example, computer systems may have different types and quantities of processors, different operating systems, different application programs, and different peripherals. Additionally, the communications path between computer systems of a distributed system may include a number of networking components, such as, for example, firewalls, routers, proxies and gateways. Each networking component may include one or more software or hardware modules that condition and/or format portions of data so as to make them accessible to other modules in the distributed system.
In some cases, “distributed applications” are specifically designed for execution in a distributed system. Due to the number of modules that may be included in a distributed system, properly designing and configuring distributed applications is significantly more complex than designing and configuring applications for execution at single computer system. Each portion of a distributed application, in addition to being configured for proper operation in a stand-alone mode, must also be configured to appropriately communicate with other portions of the distributed application, as well as other modules in associated distributed systems. As such, distributed applications are often tested to help ensure desired operation. Testing may be performed to find and predict the severity of defects (or “bugs”) that might cause data corruption or cause modules of the distributed system to crash.
One common testing technique used on distributed applications is to intentionally cause, or “inject,” a program fault during program execution. By causing program faults in different modules of a distributed application and under different operating conditions, a tester may be able to determine potential defects in the distributed application. However, even if a tester discovers a defect, there may be no simple way to tell where the defect is occurring. Communication between portions of a distributed application may be transported through any number of network modules (e.g. modules of firewalls, routers, or other computer systems etc.), some outside the tester's control, and any one of which may potentially cause a defect. In some cases, a tester is not even aware of the existence of modules that may potentially cause a defect. This is especially true of distributed applications operating on the Internet, where a number of different entities may control the different modules used to facilitate communication between portions of a distributed application.
To increase the chance of locating modules that are causing a defect, some developers may insert specialized testing code into a distributed application. Other developers may run specialized testing code to modify a distributed application so as to “prepare” the distributed application for testing. Specialized code may cause a distributed application to report test information from different modules of a distributed system back to a tester. Thus, a tester may have a better indication of where a defect is occurring. However, the use of specialized testing code has some inherent problems: specialized testing code is often self-contained and will not interact with other testing programs; and specialized testing code often tests only a small portion of a distributed application's functionality. Specialized testing code may also require specialized environments, thus making it difficult to test “live” data. One of the difficulties in using specialized testing environments is a decreased ability to test timing interactions between different portions of a distributed application. Only in a deployed system can the vast majority of timing interdependencies be tested. In most specialized testing environments, it is not practical to produce all possible timing combinations that may occur.
Since specialized testing code is often incompatible with other testing programs, different versions specialized testing code must be individually developed for different distributed applications. This is time consuming and may require substantially technical expertise on the part of a programmer. Furthermore, reporting test information from different modules of a distributed system back to a tester may consume bandwidth and degrade performance of the distributed system. Thus, time and effort must often be expended to remove specialized testing code from a distributed application before the distributed application is released into production.
Therefore, what are desired are systems, methods, and computer program products, for more efficiently and accurately testing distributed applications.